/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ufpa.sorteio.bean;

import br.com.ufpa.sorteio.bean.model.AtividadeDataModel;
import br.com.ufpa.sorteio.dao.AtividadeDAO;
import br.com.ufpa.sorteio.dao.EquipeDAO;
import br.com.ufpa.sorteio.entidade.Atividade;
import br.com.ufpa.sorteio.entidade.Equipe;
import br.com.ufpa.sorteio.entidade.Professor;
import br.com.ufpa.sorteio.entidade.Tema;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 *
 * @author Weslley
 */
@SessionScoped
@ManagedBean(name = "atividadeMB")
public class AtividadeMB implements Serializable {

    private Atividade atividade;
    private AtividadeDAO dao;
    private int quantidadeTemas;
    private Set<Tema> temasSelecionados;

    private AtividadeDataModel listaAtividades;

    private Atividade atividadeSelecionada;

    public AtividadeMB() {
        atividade = new Atividade();
    }

    public void cadastraAtividade(Professor professor) {
        if (!(atividade == null)) {
            if (!(temasSelecionados.isEmpty())) {
                Set<String> temas = new HashSet<>();
                temasSelecionados.stream().forEach((tema) -> {
                    temas.add(tema.getNome());
                });
                atividade.setTemas(temas);
                atividade.setProfessor(professor);
                dao = new AtividadeDAO();
                dao.startOperation();
                dao.save(atividade);
                dao.stopOperation(true);

                temasSelecionados = new HashSet<>();
                atividade = new Atividade();

                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Atividade Cadastrada!"));
            }
            temasSelecionados = new HashSet<>();
            atividade = new Atividade();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Não foi possível cadastrar a atividade. Verifique"
                    + " se foi selecionado algum tema"));
        }
        temasSelecionados = new HashSet<>();
        atividade = new Atividade();
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Favor verificar se os campos não estão em branco."));
    }

    public AtividadeDataModel buscaListaAtividades() {
        AtividadeDAO ativDAO = new AtividadeDAO();
        List<Atividade> atividades = new ArrayList<>();
        ativDAO.startOperation();
        atividades = ativDAO.recuperaListaAtividadeRegistrando();
        ativDAO.stopOperation(false);

        listaAtividades = new AtividadeDataModel(atividades);

        return listaAtividades;
    }

    public void vinculaEquipeAtividade(Equipe equipe) {
        EquipeDAO equipeDAO = new EquipeDAO();
        equipe.setAtividade(atividadeSelecionada);

        equipeDAO.startOperation();
        equipeDAO.update(equipe);
        equipeDAO.stopOperation(true);

        verificaQuantidadeEquipesPorAtividade(atividadeSelecionada);

        atividadeSelecionada = new Atividade();

        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Equipe cadastrada na atividade."));
    }

    private void verificaQuantidadeEquipesPorAtividade(Atividade at) {
        EquipeDAO equipeDAO = new EquipeDAO();

        equipeDAO.startOperation();
        int i = equipeDAO.recuperaTamanhoListaEquipesPorAtividade(at);
        equipeDAO.stopOperation(false);

        if (i == at.getQuantidadeEquipes()) {
            at.setAceitaRegistro(false);
            dao = new AtividadeDAO();
            dao.startOperation();
            dao.update(at);
            dao.stopOperation(true);
        }
    }

    public void populaListaTemas() {
        temasSelecionados = new HashSet<>();
        for (int i = 0; i < quantidadeTemas; i++) {
            Tema tema = new Tema();
            tema.setPosicao(i + 1);
            temasSelecionados.add(tema);
        }
    }

    public Atividade getAtividade() {
        return atividade;
    }

    public void setAtividade(Atividade atividade) {
        this.atividade = atividade;
    }

    public int getQuantidadeTemas() {
        return quantidadeTemas;
    }

    public void setQuantidadeTemas(int quantidadeTemas) {
        this.quantidadeTemas = quantidadeTemas;
    }

    public Atividade getAtividadeSelecionada() {
        return atividadeSelecionada;
    }

    public void setAtividadeSelecionada(Atividade atividadeSelecionada) {
        this.atividadeSelecionada = atividadeSelecionada;
    }

    public Set<Tema> getTemasSelecionados() {
        return temasSelecionados;
    }

    public void setTemasSelecionados(Set<Tema> temasSelecionados) {
        this.temasSelecionados = temasSelecionados;
    }

}
